package com.tjh.gulimall.auth.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.tjh.common.utils.HttpUtils;
import com.tjh.common.utils.R;
import com.tjh.common.vo.MemberRespVo;
import com.tjh.gulimall.auth.feign.MemberFeignService;
import com.tjh.gulimall.auth.vo.SocialUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

/**
 * day99：
 *   处理社交登录请求
 * 测试：
 *      1、浏览器访问：http://auth.gulimall.com/login.html
 *      2、点击登录模块的微博图标
 *      3、微博登录
 *      4、登录成功跳转到首页
 * Create by koala on 2021-05-12
 */
@Controller
@Slf4j
public class OAuth2Controller {

    @Autowired
    MemberFeignService memberFeignService;

    /**
     * 登录成功回调
     */
    @GetMapping("/oauth2.0/weibo/success")
    public String weibo(@RequestParam("code")String code, HttpSession session) throws Exception {
        //1.根据code换区accessToken
        Map<String,String> map = new HashMap<>();
        map.put("client_id","3436057918");
        map.put("client_secret","6a0317da60f3b2aef3f369faddefc021");
        map.put("grant_type","authorization_code");
        map.put("redirect_uri","http://auth.gulimall.com/oauth2.0/weibo/success");
        map.put("code",code);
        Map<String, String> headers = new HashMap<>();
        HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", headers, null, map);
        //2.登录成功调回首页
        //处理
        if(response.getStatusLine().getStatusCode() == 200){
            //获取到了accessToken
            String json = EntityUtils.toString(response.getEntity());
            SocialUser socialUser = JSON.parseObject(json,SocialUser.class);
            //知道当前是哪个社交用户
            //1.当前用户如果是第一次进网站，自动注册进来（为当前社交用户生成一个会员信息账号，以后这个社交账户对应指定的会员）
            //登录或者注册这个社交用户
            R oauthlogin = memberFeignService.oauthlogin(socialUser);
            if (oauthlogin.getCode() == 0) {
                MemberRespVo data = oauthlogin.getData("data", new TypeReference<MemberRespVo>() {});
                log.info("登录成功：用户：｛｝",data.toString());

                /**
                 * day100：自定义SpringSession完成子域session共享
                 *      1.第一次使用session：命令浏览器保存卡号，JSESSIONID这个cookie，
                 *          以后浏览器访问哪个网站就会带上这个网站的cookie
                 *          子域之间 gulimall.com   auth.gulimall.com order.gulimall.com
                 *          发卡的时候（指定域名为父域名），即使是子域系统发的卡，也能让父域直接使用
                 *      2.登录成功就跳回首页
                 */
                session.setAttribute("loginUser",data);
                return "redirect:http://gulimall.com";
            }else {
                return "redirect:http://auth.gulimall.com/login.html";
            }
        }else {
            return "redirect:http://auth.gulimall.com/login.html";
        }
    }
}
